#ifndef QPLAINTEXTEDITAPPENDER_H
#define QPLAINTEXTEDITAPPENDER_H

#include "baseappender.h"
#include <QPlainTextEdit>
#include <QSyntaxHighlighter>
#include <QRecursiveMutex>




// 高亮器：用于QPlainTextEdit的日志颜色高亮
class LogHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT
public:
    explicit LogHighlighter(QTextDocument* parent = nullptr);

    void setLevelColor(LogLevel level, const QColor& color);// 设置日志级别的颜色（支持动态修改）

protected:
    void highlightBlock(const QString& text) override;// 高亮规则：匹配日志开头的级别标识（如"[Debug]"）

private:
    QMap<LogLevel, QColor> m_levelColors;  // 日志级别-颜色映射
};







// Qt组件输出器：基于QPlainTextEdit，支持颜色高亮和行数限制
class QPlainTextEditAppender : public BaseAppender
{
    Q_OBJECT
public:
    // 构造函数：需指定关联的QPlainTextEdit（可为nullptr，后续通过setWidget设置）
    explicit QPlainTextEditAppender(LogLevel level = LogLevel::Debug,
                                    QPlainTextEdit* widget = nullptr);


    void setWidget(QPlainTextEdit* widget);// 设置输出目标组件（QPlainTextEdit）
    void setLevelColor(LogLevel level, const QColor& color);// 动态设置日志级别的颜色
    void setMaxLines(int maxLines);// 设置最大显示行数（0表示无限制）
    void append(LogLevel level, const QString& msg) override;// 重写append：输出日志到QPlainTextEdit（线程安全）

private slots:
    void doAppend(const QString& msg, int currentLines, int maxLines);// 实际执行日志追加（确保在UI线程调用）

private:
    QPlainTextEdit* m_widget;       // 关联的QPlainTextEdit组件
    LogHighlighter* m_highlighter;  // 高亮器（负责颜色显示）
    int m_maxLines;                 // 最大显示行数
    int m_currentLines;             // 当前行数
    QRecursiveMutex m_mutex;                 // 线程安全锁（多线程日志写入）
};

#endif // QPLAINTEXTEDITAPPENDER_H
